package br.com.hstar.client.funcionario.funcionario;

import java.util.Iterator;
import java.util.List;

import br.com.hstar.client.ServiceFactory;
import br.com.hstar.client.funcionario.funcao.FuncaoUI;
import br.com.hstar.client.util.FormPanel;
import br.com.hstar.client.util.HstarDialogBox;
import br.com.hstar.client.util.HstarUserException;
import br.com.hstar.client.util.calendar.DatePicker;

import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

public class FuncionarioEditPanel extends FormPanel {

	private Button incluir;
	private Button cancelar;
	private Button excluir;
	
	private FuncionarioUI funcionarioUI;
	
	private TextBox nome;
	private TextBox login;
	private PasswordTextBox password;
	private TextBox logradouro;
	private TextBox numero;
	private TextBox complemento;
	private TextBox endereco;
	private TextBox bairro;
	private TextBox cidade;
	private TextBox estado;
	private TextBox cep;
	private TextBox telefone;
	private TextBox celular;
	private TextBox cpf;
	private TextBox identidade;
	private ListBox funcao;
	private DatePicker admissao;
	private TextArea observacao;
	private TextBox descricaoFuncao;
	
	public FuncionarioEditPanel(String _title) {
		super(_title);
		funcionarioUI = new FuncionarioUI();
		init(true);
	}
	
	public FuncionarioEditPanel(String _title, Long id) {
		super(_title);
		funcionarioUI = new FuncionarioUI();
		funcionarioUI.setId(id);
		init(false);
		ServiceFactory.createFuncionarioService().retrieveById(id, new RetrieveAsyncCallback());
	}
	
	//Methods -------------------------------------------------------------------
	
	private void init(boolean isNew) {
		nome= addTextBox("Nome", 40, 40, "");
	    login= addTextBox("Login", 40, 40, "");
	    password= addPasswordTextBox("Senha", "");
	    logradouro= addTextBox("Logradouro", 40, 40, "");
	    numero= addTextBox("Número", 40, 40, "");
	    complemento= addTextBox("Complemento", 40, 40, "");
	    endereco= addTextBox("Endereço", 40, 40, "");
	    bairro= addTextBox("Bairro", 40, 40, "");
	    cidade= addTextBox("Cidade", 40, 40, "");
	    estado= addTextBox("Estado", 40, 40, "");
	    cep= addTextBox("CEP", 40, 40, "");
	    telefone= addTextBox("Telefone", 40, 40, "");
	    celular= addTextBox("Celular", 40, 40, "");
	    cpf= addTextBox("CPF", 40, 40, "");
	    identidade= addTextBox("Identidade", 40, 40, "");
	    funcao = addListBox("Função", true);
	    ServiceFactory.createFuncaoService().listAll(new ListAllFuncaoAsyncCallback());
	    admissao = addCalendar("Admissão");
	    admissao.setReadOnly(true);
	    observacao = addTextArea("Observação", "300", "200", "");
	    descricaoFuncao= addTextBox("Descrição da Função", 40, 40, "");
		
		
		if(isNew) {
			incluir  = addButton("Incluir");
			cancelar = addButton("Cancelar");
		} else {
			incluir  = addButton("Alterar");
			cancelar = addButton("Cancelar");
			excluir = addButton("Excluir");
			excluir.addClickListener(new ClickListener() {
				public void onClick(Widget sender) {
					ServiceFactory.createFuncionarioService().delete(funcionarioUI.getId(), new DeleteAsyncCallback());
				}
			});
		}
		
		incluir.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				try{
					 copyData();
					 ServiceFactory.createFuncionarioService().saveOrUpdate(funcionarioUI, new SaveAsyncCallback());
				} catch (HstarUserException e) {
					new HstarDialogBox("Funcionário", e.getMessage());
				}
			}
		});
		cancelar.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				RootPanel.get("boxContent").clear();
				RootPanel.get("boxContent").add(new FuncionarioListPanel("Funcionário"));
			}
		});
		
	}

	private void copyData() throws HstarUserException {
		
		String msgErro = "";
		if(funcao.getSelectedIndex() < 1)
		{
			msgErro += " - Selecione uma função <br>";
		}
		
		if(nome.getText().trim() == "")
		{
			msgErro += " - Digite o nome do funcionário <br>";			
		}
		
		if(login.getText().trim() == "")
		{
			msgErro += " - Digite o login do funcionário <br>";			
		}
		
		if(password.getText().trim() == "")
		{
			msgErro += " - Digite o password do funcionário <br>";			
		}
		
		if(logradouro.getText().trim() == "")
		{
			msgErro += " - Digite o logradouro do funcionário <br>";			
		}
		
		if(numero.getText().trim() == "")
		{
			msgErro += " - Digite o número do endereço do funcionário <br>";			
		}
		
		if(bairro.getText().trim() == "")
		{
			msgErro += " - Digite o bairro do funcionário <br>";			
		}
		
		if(cidade.getText().trim() == "")
		{
			msgErro += " - Digite a cidade do funcionário <br>";			
		}
		
		if(estado.getText().trim() == "")
		{
			msgErro += " - Digite o estado do funcionário <br>";			
		}
		
		if(cep.getText().trim() == "")
		{
			msgErro += " - Digite o cep do funcionário <br>";			
		}
		
		if(admissao.getText().trim() == "")
		{			
			msgErro += " - Selecione a data de admissão <br>";
		}
		
		if(msgErro != "")
		{
			throw new HstarUserException(msgErro);			
		}
		
		funcionarioUI.setFuncao(
				new FuncaoUI(new Long(funcao.getValue(funcao.getSelectedIndex()))));
		
		funcionarioUI.setNome(nome.getText().trim());
		funcionarioUI.setLogin(login.getText().trim());
		funcionarioUI.setPassword(password.getText().trim());
		funcionarioUI.setLogradouro(logradouro.getText().trim());
		funcionarioUI.setNumero(numero.getText().trim());
		funcionarioUI.setComplemento(complemento.getText().trim());
		funcionarioUI.setEndereco(endereco.getText().trim());
		funcionarioUI.setBairro(bairro.getText().trim());
		funcionarioUI.setCidade(cidade.getText().trim());
		funcionarioUI.setEstado(estado.getText().trim());
		funcionarioUI.setCep(cep.getText().trim());
		funcionarioUI.setTelefone(telefone.getText().trim());
		funcionarioUI.setCelular(celular.getText().trim());
		funcionarioUI.setCpf(cpf.getText().trim());
		funcionarioUI.setIdentidade(identidade.getText().trim());
		funcionarioUI.setAdmissao(admissao.getSelectedDate());		
		funcionarioUI.setObservacao(observacao.getText().trim());
		funcionarioUI.setDescricaoFuncao(descricaoFuncao.getText().trim());
	}

	// INNER CLASSES ----------------------------------------------------------------
	private class SaveAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			if(caught instanceof HstarUserException)
			{					
				new HstarDialogBox("Funcion�rio",caught.getMessage());
			}
		}

		public void onSuccess(Object result) {
			RootPanel.get("boxContent").clear();
			RootPanel.get("boxContent").add(new FuncionarioListPanel("Funcionário"));
		}
	}
	
	private class DeleteAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO - Funcionario edit panel");
		}

		public void onSuccess(Object result) {
			RootPanel.get("boxContent").clear();
			RootPanel.get("boxContent").add(new FuncionarioListPanel("Funcionário"));
		}
	}
	
	//carrega os campos. Usado para quando está editando
	private class RetrieveAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO - Funcionário edit panel");
		}

		public void onSuccess(Object result) {
			FuncionarioUI funcionario = (FuncionarioUI)result;

			nome.setText(funcionario.getNome().trim());
		    login.setText(funcionario.getLogin().trim());
		    password.setText(funcionario.getPassword().trim());
		    logradouro.setText(funcionario.getLogradouro().trim());
		    numero.setText(funcionario.getNumero().trim());
		    complemento.setText(funcionario.getComplemento().trim());
		    endereco.setText(funcionario.getEndereco().trim());
		    bairro.setText(funcionario.getBairro().trim());
		    cidade.setText(funcionario.getCidade().trim());
		    estado.setText(funcionario.getEstado().trim());
		    cep.setText(funcionario.getCep().trim());
		    telefone.setText(funcionario.getTelefone().trim());
		    celular.setText(funcionario.getCelular().trim());
		    cpf.setText(funcionario.getCpf().trim());
		    identidade.setText(funcionario.getIdentidade().trim());
		    admissao.setText(funcionario.getAdmissao());
		    observacao.setText(funcionario.getObservacao().trim());
		    descricaoFuncao.setText(funcionario.getDescricaoFuncao().trim());
			
			
			if (funcao != null && funcionario.getId() != null) {
				for(int i = 0; i < funcao.getItemCount(); i++) {
					if(funcao.getItemText(i).equals(funcionario.getFuncao().getValue(1))) {
						funcao.setSelectedIndex(i);
						break;
					}
				}
			}
		}
	}
	
//	lista todos os clientes para colocar no listbox
	private class ListAllFuncaoAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO ao listar Funcionário");
		}

		public void onSuccess(Object result) {
			List funcoes = (List) result;
			for (Iterator iter = funcoes.iterator(); iter.hasNext();) {
				FuncaoUI funcaoUI = (FuncaoUI) iter.next();
				funcao.addItem(funcaoUI.getDescricao(), funcaoUI.getId().toString());				
			}
		}
	}

}      